package learn.ch1.pool;

import java.util.concurrent.*;

/**
 * @Description todo
 * @Author yusj
 * @Date 2021/12/13
 * @Version 1.0
 */
public class TsPool01 {
    public static void main(String[] args) {
        ArrayBlockingQueue queue=new ArrayBlockingQueue(5);
        TsPoolThFactory01  tsPoolThFactory01=new TsPoolThFactory01();

        ThreadPoolExecutor  pool=
                new ThreadPoolExecutor(5,//核心线程数
                        7,//最大线程数
                        5,//空闲线程的存活时间  maxinumPoolSize-corePoolSize
                        TimeUnit.SECONDS,//空闲线程存活时间  单位
                        queue,//队列。要用有界队列。也就是能设置大小的队列。
                        tsPoolThFactory01,//线程创建factory
                        new ThreadPoolExecutor.DiscardPolicy());//当队列满时的处理策略。

        /**
         * 队列满时的处理策略
         * new ThreadPoolExecutor.AbortPolicy() 拒绝后续任务，会抛一个异常出来，主线程会终止。
         * CallerRunsPolicy  用调用者所在的线程（主线程）  直接执行。
         * DiscardOldestPolicy   丢弃队列中最靠前的任务，执行当前任务。
         * DiscardPolicy  丢弃任务。
         */


        //5+5.1.
        System.out.println("before"+pool);
        for(int i=0;i<14;i++){
            try{
                pool.execute(()->{
                    try {
                        Thread.sleep(20000);
                        System.out.println(Thread.currentThread().getName()+"--over");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });
                System.out.println("in i="+i+"->"+pool);

            }catch(RejectedExecutionException e){
                System.out.println(e.getMessage());
                continue;
            }
        }


        Future future=pool.submit(new Call01());
        try {
            System.out.println("get future"+future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        System.out.println("-----after-----");
        //队列中线程。超时处理。
        while(true){
            try {
                Thread.sleep(2000);
                System.out.println(pool);
                if(pool.getCompletedTaskCount()==12){
                    break;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        pool.shutdown();

    }
}
